package net.lgy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import net.lgy.controller.req.FolderCreateReq;
import net.lgy.dto.AccountFileDTO;
import net.lgy.enums.BizCodeEnum;
import net.lgy.enums.FolderFlagEnum;
import net.lgy.exception.BizException;
import net.lgy.mapper.AccountFileMapper;
import net.lgy.model.AccountFileDO;
import net.lgy.service.FileService;
import net.lgy.util.SpringBeanUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 小滴课堂,愿景：让技术不再难学
 *
 * @Description
 * @Author 二当家小D
 * @Remark 有问题直接联系我，源码-笔记-技术交流群,官网 https://xdclass.net
 * @Version 1.0
 **/
@Service
@Slf4j
public class FileServiceImpl implements FileService {

    @Autowired
    private AccountFileMapper accountFileMapper;

    /**
     * 获取文件列表接口
     * @param accountId
     * @param parentId
     * @return
     */
    @Override
    public List<AccountFileDTO> listFile(Long accountId, Long parentId) {

        List<AccountFileDO> accountFileDOList = accountFileMapper.selectList(new QueryWrapper<AccountFileDO>()
                .eq("account_id", accountId).eq("parent_id", parentId)
                .orderByDesc("is_dir")
                .orderByDesc("gmt_create")
        );

        return SpringBeanUtil.copyProperties(accountFileDOList, AccountFileDTO.class);
    }

    /**
     * 创建文件夹
     * @param req
     */
    @Override
    public Long createFolder(FolderCreateReq req) {

        AccountFileDTO accountFileDTO = AccountFileDTO.builder().accountNo(req.getAccountNo())
                .parentId(req.getParentId())
                .fileName(req.getFolderName())
                .isDir(FolderFlagEnum.YES.getCode())
                .build();

       return saveAccountFile(accountFileDTO);

    }

//    处理用户和文件的关联关系，存储文件和文件夹通用
    private Long saveAccountFile(AccountFileDTO accountFileDTO) {
//        检查父文件是否存在
        Boolean b = checkParentFile(accountFileDTO);

        AccountFileDO accountFileDO = SpringBeanUtil.copyProperties(accountFileDTO, AccountFileDO.class);

//        检查文件是否重名
//        如果文件重复，则后缀加内容
        processFileNameDuplicate(accountFileDO);

//        保存相关文件关系
        accountFileMapper.insert(accountFileDO);




        return accountFileDO.getId();
    }

    private void processFileNameDuplicate(AccountFileDO accountFileDO) {
//        先查找文件是否在，在的话加后缀
        //        用selectCount判断文件是否存在（返回数量）
        Long selectCount = accountFileMapper.selectCount(new QueryWrapper<AccountFileDO>().eq("account_no", accountFileDO.getAccountNo())
                .eq("parent_id", accountFileDO.getParentId())
                .eq("is_dir", accountFileDO.getIsDir()).eq("file_name", accountFileDO.getFileName()));
        if (selectCount > 0){
//            说明重复了，处理重复文件夹
            if (accountFileDO.getIsDir().equals(FolderFlagEnum.YES.getCode())){
                accountFileDO.setFileName(accountFileDO.getFileName()+"(1)");
            }else {
//                提取文件扩展名
                String[] split = accountFileDO.getFileName().split("\\.");
                accountFileDO.setFileName(split[0]+"(1)."+split[1]);
            }
//            处理重复文件名

        }
    }


    private Boolean checkParentFile(AccountFileDTO accountFileDTO) {
        if (accountFileDTO.getParentId() != null){
            AccountFileDO accountFileDO = accountFileMapper.selectOne(new QueryWrapper<AccountFileDO>()
                    .eq("id", accountFileDTO.getParentId())
                    .eq("account_no",accountFileDTO.getAccountNo()));

            if (accountFileDTO == null){
                throw new BizException(BizCodeEnum.FILE_NOT_EXISTS);
            }
            return true;


        }
        return false;



    }
}